#include "battery.h"
#include "pins_config.h"  // 引入引脚定义

// ====================================================================================
// Battery 电池电量管理类实现
// ====================================================================================

Battery::Battery(Screen& screen) : _screen(screen) {
}

void Battery::init() {
  pinMode(PIN_BAT_VOLT, INPUT);  // 将电压检测引脚设置为输入
}

int Battery::getADC() {
  return analogRead(PIN_BAT_VOLT);
}

int Battery::getVoltage() {
  return getSmoothedVoltage();  // 使用平滑后的电压值
}

int Battery::getSmoothedVoltage() {
  long sum = 0;
  
  // 多次采样取平均，减少噪声影响
  for (int i = 0; i < SAMPLE_COUNT; i++) {
    sum += analogReadMilliVolts(PIN_BAT_VOLT);
    Serial.println("getSmoothedVoltage sum:" + String(sum));
    delayMicroseconds(100);  // 短延时，减少采样相关性
  }
  
  return sum / SAMPLE_COUNT;
}

int Battery::getPercentage() {
  int voltage = getVoltage();
  
  // 限制电压范围
  voltage = constrainVoltage(voltage);
  
  // 计算百分比
  int percentage = map(voltage, MIN_VOLTAGE, MAX_VOLTAGE, 0, 100);
  
  // 限制百分比范围，防止超出0-100
  percentage = constrainPercentage(percentage);
  
  return percentage;
}

void Battery::drawIcon(int x, int y) {
  int percentage = getPercentage();
  drawIcon(x, y, percentage);
}

void Battery::drawIcon(int x, int y, int percentage) {
  // 确保百分比在有效范围内
  percentage = constrainPercentage(percentage);
  
  // 绘制电池外框
  _screen.spr.drawRect(x, y, ICON_WIDTH, ICON_HEIGHT, TFT_WHITE);
  
  // 绘制电池正极（小突起）
  _screen.spr.fillRect(x + ICON_WIDTH, y + (ICON_HEIGHT - ICON_BATTERY_TIP_HEIGHT) / 2, 
                       ICON_BATTERY_TIP_WIDTH, ICON_BATTERY_TIP_HEIGHT, 
                       TFT_WHITE);
  
  // 根据电量百分比确定填充颜色
  uint16_t fillColor = getFillColor(percentage);
  
  // 计算填充宽度（内部留出1像素边距）
  int innerWidth = ICON_WIDTH - 2;
  int innerHeight = ICON_HEIGHT - 2;
  int fillWidth = map(percentage, 0, 100, 0, innerWidth);
  
  // 填充电量条
  if (fillWidth > 0) {
    _screen.spr.fillRect(x + 1, y + 1, fillWidth, innerHeight, fillColor);
  }
  
  // 清除未填充区域（显示为黑色）
  if (fillWidth < innerWidth) {
    _screen.spr.fillRect(x + 1 + fillWidth, y + 1, 
                         innerWidth - fillWidth, innerHeight, 
                         TFT_BLACK);
  }
  
  // 显示百分比文字
  _screen.spr.setTextColor(TFT_WHITE, TFT_BLACK);
  _screen.spr.setTextDatum(TL_DATUM);
  
  // 计算文字显示位置（图标右侧 + 5像素间距）
  int textX = x + ICON_WIDTH + ICON_BATTERY_TIP_WIDTH + 3;
  int textY = y + 1;
  
  // 清除文字区域（预留足够宽度显示"100%"）
  _screen.spr.fillRect(textX, y, 35, ICON_HEIGHT, TFT_BLACK);
  
  // 绘制百分比数字
  String batteryText = String(percentage) + "%";
  _screen.spr.drawString(batteryText, textX, textY, 1);
}

uint16_t Battery::getFillColor(int percentage) {
  if (percentage > 60) {
    return TFT_GREEN;      // 电量充足 - 绿色
  } else if (percentage > 20) {
    return TFT_YELLOW;     // 电量中等 - 黄色
  } else {
    return TFT_RED;        // 电量低 - 红色
  }
}

int Battery::constrainVoltage(int voltage) {
  if (voltage < MIN_VOLTAGE) {
    return MIN_VOLTAGE;
  }
  if (voltage > MAX_VOLTAGE) {
    return MAX_VOLTAGE;
  }
  return voltage;
}

int Battery::constrainPercentage(int percentage) {
  if (percentage < 0) {
    return 0;
  }
  if (percentage > 100) {
    return 100;
  }
  return percentage;
}
